package br.com.fogas.database;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import br.com.fogas.database.entidade.A903;
import br.com.fogas.database.entidade.A942;
import br.com.fogas.database.entidade.A951;
import br.com.fogas.database.entidade.A952;
import br.com.fogas.database.entidade.A957;
import br.com.fogas.database.entidade.A962;
import br.com.fogas.database.entidade.A963;
import br.com.fogas.database.entidade.A965;
import br.com.fogas.database.entidade.A966;
import br.com.fogas.database.entidade.A970;
import br.com.fogas.database.entidade.A971;
import br.com.fogas.database.entidade.A972;
import br.com.fogas.database.entidade.A973;
import br.com.fogas.database.entidade.A975;
import br.com.fogas.database.entidade.A976;
import br.com.fogas.database.entidade.A977;
import br.com.fogas.database.entidade.A979;
import br.com.fogas.database.entidade.A982;
import br.com.fogas.database.entidade.A983;
import br.com.fogas.database.entidade.A987;
import br.com.fogas.database.entidade.Canal;
import br.com.fogas.database.entidade.Cliente;
import br.com.fogas.database.entidade.CondicaoPagto;
import br.com.fogas.database.entidade.Config;
import br.com.fogas.database.entidade.Material;
import br.com.fogas.database.entidade.Medidor;
import br.com.fogas.database.entidade.MedidorHistorico;
import br.com.fogas.database.entidade.NotaControle;
import br.com.fogas.database.entidade.NotaFiscal;
import br.com.fogas.database.entidade.NotaItem;
import br.com.fogas.database.entidade.NotaItemCondicoes;
import br.com.fogas.database.entidade.NotaOcorrencia;
import br.com.fogas.database.entidade.PlanoVisitas;
import br.com.fogas.database.entidade.Sincronizacao;
import br.com.fogas.database.entidade.Usuario;

import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;

public class DatabaseHelper extends OrmLiteSqliteOpenHelper {

	private static final String DATABASE_NAME = "FogasMedicao.sqlite";

	private static final int DATABASE_VERSION = 1;
	
	private static final String TAG = DatabaseHelper.class.getName();

	public DatabaseHelper(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}
	
	public void dropAndCreateTables() {
		try {
			Log.i(DatabaseHelper.class.getName(), "onUpgrade");
			for (Class<?> clazz : TABELAS) {
				TableUtils.dropTable(getConnectionSource(), clazz, true);
				Log.i(TAG, "dropTable table "+ clazz.getName());
			}
			onCreate(getReadableDatabase(), getConnectionSource());
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
		for (Class<?> clazz : TABELAS) {
			try {
				TableUtils.createTable(connectionSource, clazz);
				Log.i(TAG, "onCreate table "+ clazz.getName());
			} catch (SQLException e) {
				Log.e(TAG, "Can't create table: "+clazz.getName(), e);
				throw new RuntimeException(e);
			}
		}
	}

	@Override
	public void onUpgrade(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource, 
			int oldVersion, int newVersion) {
		try {
			Log.i(DatabaseHelper.class.getName(), "onUpgrade");
			for (Class<?> clazz : TABELAS) {
				TableUtils.dropTable(connectionSource, clazz, true);
				Log.i(TAG, "dropTable table "+ clazz.getName());
			}
			onCreate(sqliteDatabase, connectionSource);
		} catch (SQLException e) {
			Log.e(TAG, "Can't drop databases", e);
			throw new RuntimeException(e);
		}
	}

	@Override
	public void close() {
		super.close();
	}
	
	public static List<Class<?>> TABELAS  = new ArrayList<Class<?>>();
	static {
		TABELAS.add(A903.class);
		TABELAS.add(A942.class);
		TABELAS.add(A951.class);
		TABELAS.add(A952.class);
		TABELAS.add(A957.class);
		TABELAS.add(A962.class);
		TABELAS.add(A963.class);
		TABELAS.add(A965.class);
		TABELAS.add(A966.class);
		TABELAS.add(A970.class);
		TABELAS.add(A971.class);
		TABELAS.add(A972.class);
		TABELAS.add(A973.class);
		TABELAS.add(A975.class);
		TABELAS.add(A976.class);
		TABELAS.add(A977.class);
		TABELAS.add(A979.class);
		TABELAS.add(A982.class);
		TABELAS.add(A983.class);
		TABELAS.add(A987.class);
		TABELAS.add(Config.class);
		TABELAS.add(CondicaoPagto.class);
		TABELAS.add(Canal.class);
		TABELAS.add(Cliente.class);
		TABELAS.add(Material.class);
		TABELAS.add(Medidor.class);
		TABELAS.add(MedidorHistorico.class);
		TABELAS.add(NotaControle.class);
		TABELAS.add(Sincronizacao.class);
		TABELAS.add(Usuario.class);
		TABELAS.add(PlanoVisitas.class);
		TABELAS.add(NotaFiscal.class);
		TABELAS.add(NotaItem.class);
		TABELAS.add(NotaItemCondicoes.class);
		TABELAS.add(NotaOcorrencia.class);
	}
}